#include "SENSOR/ultrasonic.h"

/**
 ****************************************************************************************************
 * DONE 用户变量区
 ****************************************************************************************************
 */

TIM_HandleTypeDef *ultrasonic_tim=&htim9;

//计数值
uint16_t msHcCount;


/**
 ****************************************************************************************************
 * DONE 用户函数区
 ****************************************************************************************************
 */


//初始化
void Ultrasonic_Init(void)
{
    HAL_GPIO_WritePin(ULTRASONIC_GPIO_PORT, ULTRASONIC_TRIG_GPIO_PIN, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(ULTRASONIC_GPIO_PORT, ULTRASONIC_ECHO_GPIO_PIN, GPIO_PIN_RESET);
//	TIM9_Int_Init(1000-1,72-1);
}

//启动计数器
static void OpenTimerForHc(void)
{
    
    __HAL_TIM_SET_COUNTER(ultrasonic_tim, 0); // 设置计数器为0
    msHcCount = 0;                            // 清除自定义计数变量（如用于记录ms）
    HAL_TIM_Base_Start(ultrasonic_tim);       // 启动定时器
}

//停止计数器
static void CloseTimerForHc(void)
{
    HAL_TIM_Base_Stop(ultrasonic_tim);        // 停止定时器
}

//获取定时器计数值
uint32_t GetEchoTimer(void)
{
    uint32_t t = 0;

    t = msHcCount * 1000;                       // 毫秒部分转微秒
    t += __HAL_TIM_GET_COUNTER(ultrasonic_tim);         // 加上当前TIM9计数值
    __HAL_TIM_SET_COUNTER(ultrasonic_tim, 0);           // 清空计数器

    // delay_ms(50);  // 可选延时，根据实际需求决定是否保留

    return t;
}

//超声波测距
double UltrasonicGetLength(void)
{
    uint32_t t = 0;
    int i = 0;
    double lengthTemp = 0;
    double sum = 0;

    for (i = 0; i < 5; i++)
    {
        // 触发 TRIG 发送超声波
        HAL_GPIO_WritePin(ULTRASONIC_GPIO_PORT, ULTRASONIC_TRIG_GPIO_PIN, GPIO_PIN_SET);
        delay_us(15);
        HAL_GPIO_WritePin(ULTRASONIC_GPIO_PORT, ULTRASONIC_TRIG_GPIO_PIN, GPIO_PIN_RESET);
        // USART_printf(Test_huart,"DISTANCER START");
        // 等待 ECHO 信号变为高电平
        while (HAL_GPIO_ReadPin(ULTRASONIC_GPIO_PORT, ULTRASONIC_ECHO_GPIO_PIN) == GPIO_PIN_RESET);
        // USART_printf(Test_huart,"DISTANCER TIMER START");
        OpenTimerForHc();  // 启动定时器
        // USART_printf(Test_huart,"DISTANCER WAITING...");
        // 等待 ECHO 信号变为低电平
        while (HAL_GPIO_ReadPin(ULTRASONIC_GPIO_PORT, ULTRASONIC_ECHO_GPIO_PIN) == GPIO_PIN_SET);
        // USART_printf(Test_huart,"DISTANCER OK");
        CloseTimerForHc();  // 停止定时器
        // USART_printf(Test_huart,"DISTANCER TIMER END");
        t = GetEchoTimer();  // 获取时间值（单位：us）
        lengthTemp = ((double)t / 58.0f);  // 转换为厘米（cm）
        sum += lengthTemp; 
    }

    // lengthTemp = sum / 5.0f;  // 取平均值
    return lengthTemp;
}


